package com.jacob.androidstudy.androidnote.userinterface;


import java.security.PublicKey;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.xml.sax.XMLReader;

import android.app.Activity;
import android.app.ListActivity;
import android.app.TabActivity;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Editable;
import android.text.Html;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ImageSpan;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnKeyListener;
import android.view.View.OnLongClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.ViewGroup.OnHierarchyChangeListener;
import android.view.inputmethod.EditorInfo;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.DatePicker;
import android.widget.DatePicker.OnDateChangedListener;
import android.widget.EditText;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.GridView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.QuickContactBadge;
import android.widget.RadioGroup;
import android.widget.ScrollView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.SimpleExpandableListAdapter;
import android.widget.SlidingDrawer;
import android.widget.SlidingDrawer.OnDrawerCloseListener;
import android.widget.SlidingDrawer.OnDrawerOpenListener;
import android.widget.Spinner;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabSpec;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.ToggleButton;
import android.widget.ViewSwitcher.ViewFactory;

/**
 * UserInterface
 * Android中，所有的界面组件都是android.view.View的子类。
 * 
 * 自学UI的方法：
 * 1.看官网的HelloView。
 * 2.看相关Class的API文档。
 * 3.看API Demo。
 * 4.看源码。
 * 
 */
public class UserInterface extends ListActivity{

	/**
	 * TextView
	 * TextView用来显示文本。
	 * 
	 * TextView在布局XML文件中的属性
	 * android:text - 设置TextView显示的文本内容。
	 * android:textSize - 设置TextView显示文本的大小。建议单位：sp。
	 * android:textColor - 设置TextView显示文本的颜色。
	 * android:ellipsize - 设置当文字过长时,该控件该如何显示。有如下值设置：”start”--省略号显示在开头；”end”--省略号显示在结尾；”middle”--省略号显示在中间；”marquee”--以跑马灯的方式显示。
	 * android:marqueeRepeatLimit - 设置跑马灯滚动的次数，当设置为marquee_forever时表示无限次。
	 * android:hint - Text为空时显示的文字提示信息。
	 * android:singleLine - 设置单行显示。如果和layout_width一起使用，当文本不能全部显示时，后面用“…”来表示。
	 * android:autoLink - 设置是否当文本为URL链接/email/电话号码/map时，文本显示为可点击的链接。可选值(none/web/email/phone/map/all)
	 * android:textColorLink - 设置文字链接的颜色。
	 * android:drawableBottom android:drawableLeft android:drawableRight android:drawableTop - 在text的相对位置上输出一个drawable，如图片。如果指定一个颜色的话会把text的背景设为该颜色，并且同时和background使用时覆盖后者。
	 * android:drawablePadding - 设置text与drawable(图片)的间隔，与drawableLeft、drawableRight、drawableTop、drawableBottom一起使用，可设置为负数，单独使用没有效果。
	 * android:background - 设置背景色/背景图片。TextView默认背景是透明的。
	 * android:focusable - 设置是否获得焦点。若有requestFocus()被调用时，后者优先处理。注意在表单中想设置某一个如EditText获取焦点，光设置这个是不行的，需要将这个EditText前面的focusable都设置为false才行。在Touch模式下获取焦点需要设置focusableInTouchMode为true。
	 * android:focusableInTouchMode - 设置在Touch模式下View是否能取得焦点。
	 * 
	 * 
	 */
	public void AboutTextView() {
		TextView tv = new TextView(this);
		
//		设置TextView显示的文本内容，此方法需要传入的CharSequence对象。
		tv.setText("text");
		
//		可以通过Html.fromHtml()方法将HTML标签转换为富文本放入TextView。需要注意的是，若参数中带有<img>标签。系统不会将图片直接显示，而是使用一个图像占位符代替。
		tv.setText(Html.fromHtml("<i>斜体</i><img src='http://www.google.com.hk/intl/zh-CN/images/logo_cn.png' />"));
//		若想显示图片或处理未知标签，需要使用Html.fromHtml()的另外一个重载方法，传入Html.ImageGetter对象、Html.TagHandler对象。
//		Html.ImageGetter是Html类中的一个内部接口类，包含一个回调方法getDrawable()。系统会用此方法将<img>标签转换为Drawable对象。
		Html.ImageGetter ig = new Html.ImageGetter() {
			/**
			 * 系统分析HTML标签时，若遇到<img>标签，则调用本方法。source参数就是<img>标签中的src属性。
			 * 本方法的返回值应该是Drawable对象（表示图片），或者null（表示图片占位符）。
			 */
			@Override
			public Drawable getDrawable(String source) {
				Drawable draw = UserInterface.this.getResources().getDrawable(android.R.drawable.ic_secure);
				draw.setBounds(0, 0, draw.getIntrinsicHeight(), draw.getIntrinsicWidth());
				return draw;
			}
		};
//		Html.TagHandler是Html类中的一个内部接口类，
		Html.TagHandler th = new Html.TagHandler() {
			/**
			 * 系统分析HTML标签时，若遇到未知标签，系统调用本方法。
			 */
			@Override
			public void handleTag(boolean opening, String tag, Editable output,
					XMLReader xmlReader) {
				
			}
		};
//		若不想显示图片，而显示图片占位符，第2个参数传null；若不想处理未知标签，第3个参数传null。
		tv.setText(Html.fromHtml("<i>斜体</i><img src='http://www.google.com.hk/intl/zh-CN/images/logo_cn.png' />", ig, th));
		
//		此外，TextView还可以显示带有图片、链接等内容的Span。
//		1.将图片包装成ImageSpan。
		ImageSpan imageSpan = new ImageSpan(this, android.R.drawable.ic_secure);
//		2.将链接包装成ClickableSpan。
		ClickableSpan clickableSpan = new ClickableSpan() {
			/**
			 * 点击ClickableSpan对象时，系统对调用本方法。
			 * 
			 */
			@Override
			public void onClick(View widget) {
				
			}
		};
//		3.生成SpannableStringBuilder对象。
		SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
//		4.SpannableStringBuilder.append()方法可以在末尾添加文本。
		spannableStringBuilder.append("图片链接");
//		5.spannableStringBuilder.setSpan()方法可以将ImageSpan对象、ClickableSpan对象替换到文本中。
//		第2个参数是开始下标，第3个参数是结束下标，第4个参数是替换方式。
		spannableStringBuilder.setSpan(imageSpan, 2, 3, Spanned.SPAN_COMPOSING);
//		6.将SpannableStringBuilder对象放进TextView中。
		tv.setText(spannableStringBuilder);
//		7.设置TextView对象的MovementMethod。
		tv.setMovementMethod(LinkMovementMethod.getInstance());
		
		
//		设置TextView显示文本的颜色
		tv.setTextColor(00);
		
//		触摸事件
		tv.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				return false;
			}
		});
		
//		键盘事件
		tv.setOnKeyListener(new OnKeyListener() {
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				return false;
			}
		});
		
//		点击事件
		tv.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				
			}
		});
		
//		长按事件
		tv.setOnLongClickListener(new OnLongClickListener() {
			@Override
			public boolean onLongClick(View v) {
//				返回true的话，事件就不会再向上抛给其他组件；返回false，事件会向上抛给其他组件。
//				例如：这里返回false的话，用户在屏幕上长按本组件，会系统会执行onLongClick()方法；用户长按动作结束时，然后系统会调用onClick()方法。
				return true;
			}
		});
		
		
		
	}
	
	/**
	 * Button
	 * 代表一个按钮部件。用户通过按下按钮，或者点击按钮来执行一个动作。Button实际上继承自Textview，应该看做一个特殊的文本控件。
	 * 
	 * Button在布局XML文件中的属性
	 * android:background - 设置背景色/背景图片。Button的背景图最好使用9-patch图片。这里除了设置图片，还可以设置成selectorXML文件，以实现Button在不通状态下的背景变化。
	 * 
	 * 
	 */
	public void AboutButton() {
		Button button = new Button(this);
		
//		If the background has padding, this View's padding is set to the background's padding. However, when a background is removed, this View's padding isn't touched. If setting the padding is desired, please use setPadding(int, int, int, int).
//		将Button对象的背景设置为指定的Drawable对象，或者用null来移除背景。
		button.setBackgroundDrawable(null);
		
//		将Button对象的背景设置为指定的资源。这个资源应该是Drawable对象，或者用0来移除背景。
		button.setBackgroundResource(android.R.drawable.ic_secure);
		
		
	}
	
	/**
	 * ToggleButton
	 * 通过一个带有亮度指示同时默认文本为“ON”或“OFF”的按钮显示选中/未选中状态。ToggleButton类继承自Button类。
	 * 
	 * ToggleButton在布局XML文件中的属性
	 * android:checked - 设置ToggleButton组件是否被选中
	 * android:textOn - 选中时按钮的文本
	 * android:textOff - 未选中时按钮的文本
	 * android:disabledAlpha - 设置按钮在禁用时透明度
	 * 
	 */
	public void AboutToggleButton() {
		ToggleButton toggleButton = new ToggleButton(this);
		
//		If the background has padding, this View's padding is set to the background's padding. However, when a background is removed, this View's padding isn't touched. If setting the padding is desired, please use setPadding(int, int, int, int).
//		将ToggleButton对象的背景设置为指定的Drawable对象，或者用null来移除背景。
		toggleButton.setBackgroundDrawable(null);
		
//		将ToggleButton对象的背景设置为指定的资源。这个资源应该是Drawable对象，或者用0来移除背景。
		toggleButton.setBackgroundResource(android.R.drawable.ic_secure);
		
//		设置ToggleButton对象是否被选中
		toggleButton.setChecked(true);
		
//		ToggleButton的状态改变事件
		toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
			
			@Override
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				if (isChecked) {
					
				} else {
					
				}
			}
		});
		

	}
	
	/**
	 * CheckBox
	 * 复选框是一种有双状态的特殊按钮，可以选中或者不选中。CheckBox类继承自Button类。
	 * 
	 * CheckBox在布局XML文件中的属性
	 * android:checked - 设置CheckBox组件是否被选中
	 * 
	 */
	public void AboutCheckBox() {
		CheckBox checkBox = new CheckBox(this);
		
//		设置CheckBox对象是否被选中
		checkBox.setChecked(true);
		
//		CheckBox的状态改变事件
		checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
			@Override
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				if (isChecked) {
					
				}
			}
		});
		
	}
	
	/**
	 * RadioButton
	 * 单选按钮是一种双状态的按钮，可以选择或不选中。在单选按钮没有被选中时，用户能够按下或点击来选中它。
	 * 但是，与复选框相反，用户一旦选中就不能够取消选中（可以通过代码来控制，界面上点击的效果是一旦选中之后就不能取消选中了）。
	 * RadioButton类继承自Button类。
	 * 
	 * RadioButton在布局XML文件中的属性
	 * android:checked - 设置RadioButton组件是否被选中
	 * 
	 * 
	 * RadioGroup
	 * 多个RadioButton通常与RadioGroup同时使用。当一个单选组（RadioGroup）包含几个单选按钮时，选中其中一个的同时将取消其它选中的单选按钮。
	 * RadioGroup类继承于LinearLayout类。
	 * 
	 * RadioGroup在布局XML文件中的属性
	 * android:checkedButton - 设置默认选中的RadioButton的ID
	 * android:orientation - 设置RadioGroup中选项的排列方式，horizontal横向排列，vertical竖向排列
	 * 
	 * 
	 */
	public void AboutRadioButtonAndRadioGroup() {
		RadioGroup radioGroup = new RadioGroup(this);
		
		
//		选项改变事件
		radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
			
			@Override
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				
			}
		});
		
//		子元素增加/删除事件
		radioGroup.setOnHierarchyChangeListener(new OnHierarchyChangeListener() {
			
			@Override
			public void onChildViewRemoved(View parent, View child) {
				
			}
			
			@Override
			public void onChildViewAdded(View parent, View child) {
				
			}
		});
		
	}
	
	/**
	 * CheckedTextView
	 * 类CheckedTextView继承TextView并实现Checkable接口。
	 * 当ListView的setChoiceMode方法并设定为CHOICE_MODE_SINGLE或者 CHOICE_MODE_MULTIPLE，而非CHOICE_MODE_NONE时，使用此类是很有用的。
	 * 
	 * 
	 * 
	 * 
	 * 
	 */
	public void AboutCheckedTextView() {
		
	}
	
	/**
	 * Spinner
	 * 下拉列表（Spinner）是一个每次只能选择所有项中一项的部件。它的项来自于与之相关联的适配器中。
	 * 
	 * Spinner在布局XML文件中的属性
	 * android:prompt - 下拉列表的标题。
	 * android:entries - 引用一个数据源填充Spinner。对于静态内容，这是一种比编程填充Spinner更简单的方式 。
	 * 
	 */
	public void AboutSpinner() {
		Spinner spinner = new Spinner(this);
		
//		动态生成单列的Spinner
//		1.建立数据源Datasouce，例如：从资源文件中取得String数组。
		String[] datasouce = getResources().getStringArray(android.R.array.emailAddressTypes);
//		2.建立Adapter，并连接Datasouce。
//		第2个参数，传入的是1个包含了TextView的布局XML文件的id。
		ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, datasouce);
//		若布局XML文件中包含了多个View组件，则需要指定TextView的id。
		arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_2, android.R.id.text1, datasouce);
//		系统会使用Datasouce中，每个对象的toString()方法得到字符串，然后生成TextView。
		
//		3.连接Spinner和Adapter。系统会将生成的TextView按顺序放入Spinner。
		spinner.setAdapter(arrayAdapter);
		
//		动态生成多列的Spinner。例如：在Spinner中显示一个自定义类Student。
		class Student {
			private String name;
			private int age;
			private boolean isMale;
			
			public String getName() {
				return name;
			}
			public void setName(String name) {
				this.name = name;
			}
			public int getAge() {
				return age;
			}
			public void setAge(int age) {
				this.age = age;
			}
			public boolean isMale() {
				return isMale;
			}
			public void setMale(boolean isMale) {
				this.isMale = isMale;
			}
		}
//		1.自定义Adapter，并继承于BaseAdapter。
		class StudentAdapter extends BaseAdapter {
//			定义1个Context对象。
			private Context context;
//			定义1个List，存放Student对象。
			private List<Student> students;
			
			
			public StudentAdapter(Context context, List<Student> students) {
				this.context = context;
				this.students = students;
			}
			
//			本方法返回Student的数量
			@Override
			public int getCount() {
				return this.students.size();
			}
//			本方法返回一个Student对象
			@Override
			public Object getItem(int position) {
				return students.get(position);
			}
//			
			@Override
			public long getItemId(int position) {
				return 0;
			}
//			返回用来显示Student对象的View
			@Override
			public View getView(int position, View convertView, ViewGroup parent) {
				return null;
			}
			
			
		}
		
		
		
		
		
		
		
		
		
//		增加/删除子元素事件
		spinner.setOnHierarchyChangeListener(new OnHierarchyChangeListener() {
			@Override
			public void onChildViewRemoved(View parent, View child) {
				
			}
			@Override
			public void onChildViewAdded(View parent, View child) {
				
			}
		});
		
//		长按元素事件
		spinner.setOnItemLongClickListener(new OnItemLongClickListener() {
//			parent - Spinner对象，view - 被长按的元素，position - 被长按元素在Spinner中的位置，id - 被长按元素的行ID。
			@Override
			public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
				return false;
			}
		});
		
		
//		选中元素事件
		spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
//			当Spinner中有元素被选中时，调用本方法。
//			parent - Spinner对象，view - 被选中元素，position - 被选中元素在Spinner中的位置，id - 被选中元素的行ID。
			
			@Override
			public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
				
			}
//			当Spinner中被选中的元素被取消选择时，调用本方法。
//			parent - Spinner对象
			@Override
			public void onNothingSelected(AdapterView<?> parent) {
				
			}
		});
		
	}
	
	/**
	 * ProgressBar
	 * 进度条，用来指示一些操作的进度。
	 * 
	 * ProgressBar在布局XML文件中的属性
	 * android:max - 定义ProgressBar能够接受的最大值。
	 * android:progress - 设置进度值，在0到最大值之间。
	 * android:secondaryProgress - 设置第二级的进度值，在0到最大值之间。
	 * android:progressDrawable - 设置进度条模式使用的Drawable
	 * android:indeterminate - 允许打开等待条模式
	 * android:indeterminateOnly - 限制只能使用等待条模式，进度条模式会失效。
	 * android:indeterminateDrawable - 等待条模式使用的Drawable
	 * 
	 * 
	 * 
	 */
	public void AboutProgressBar() {
		ProgressBar progressBar = new ProgressBar(this);
		
//		设置ProgressBar的最大值
		progressBar.setMax(100);
		
//		返回ProgressBar的最大值
		progressBar.getMax();
		
//		设置ProgressBar当前的进度值，在0到getMax()之间。若ProgressBar是等待条模式，则什么也不做。
		progressBar.setProgress(50);
		
//		返回ProgressBar当前的进度值。若ProgressBar是等待条模式，返回0。
		progressBar.getProgress();
		
//		设置ProgressBar的第二级进度值，在0到getMax()之间。若ProgressBar是等待条模式，则什么也不做。
		progressBar.setSecondaryProgress(70);
		
	}
	
	/**
	 * SeekBar
	 * SeekBar是ProgressBar的扩展，在其基础上增加了一个可滑动的滑片(注：就是那个可拖动的图标)。
	 * 用户可以触摸滑片并向左或向右拖动，或者使用方向键设置当前的进度等级。
	 * 不建议把可以获取焦点的widget放在SeekBar的左边或右边。
	 * 
	 * 
	 * 
	 * SeekBar在布局XML文件中的属性
	 * android:thumb - Seekbar上绘制的thumb（可拖动的那个图标）
	 * 
	 * 
	 */
	public void AboutSeekBar() {
		SeekBar seekBar = new SeekBar(this);
		
//		进度改变事件
		seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
//			用户点击离开thumb时，系统调用本方法
			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				
			}
			
//			用户点击thumb的时候，系统回调本方法
			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				
			}
//			SeekBar进度改变时，系统调用本方法
//			第3个参数 - 若进度改变是由用户发起的，则为true。
			@Override
			public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
				
			}
		});
		
	}
	
	/**
	 * QuickContactBadge
	 * 控件常用于显示一个图片与标准的联系人快捷标示和点击行为。QuickContactBadge类继承于ImageView类。
	 * 注意需要android.permission.READ_CONTACTS权限。联系人里面要有数据，并且联系人有手机号码，不然出来是一个空的。
	 * 
	 * QuickContactBadge在布局XML文件中的属性
	 * 
	 * 
	 * 
	 */
	public void AboutQuickContactBadge() {
		QuickContactBadge quickContactBadge = new QuickContactBadge(this);
		
//		Assign the contact uri that this QuickContactBadge should be associated with. Note that this is only used for displaying the QuickContact window and won't bind the contact's photo for you. Call setImageDrawable(Drawable) to set the photo
		quickContactBadge.assignContactUri(null);
		
//		Assign a contact based on an email address. This should only be used when the contact's URI is not available, as an extra query will have to be performed to lookup the URI based on the email
		quickContactBadge.assignContactFromEmail("123@123.com", true);
	}
	
	/**
	 * EditText
	 * 文本框（EditText）用来输出各种文本。EditText类继承于TextView类。
	 * 
	 * EditText在布局XML文件中的属性
	 * android:inputType - 设置文本的类型，用于帮助输入法显示合适的键盘类型。
	 * android:hint - 设置提示文字，当EditText为空时显示。
	 * android:numeric - 设置允许输入哪些字符。如“1234567890.+-/%\n()”
	 * android:lines - 设置文本的行数，设置两行就显示两行，即使第二行没有数据。
	 * android:maxLength - 限制输入字符数。如设置为5，那么仅可以输入5个汉字/数字/英文字母。
	 * android:imeOptions - 设置软键盘的回车键对应的Action值。可用’|’设置多个。
	 * 
	 * 
	 */
	public void AboutEditText() {
		EditText editText = new EditText(this);
		
//		按下回车键时，系统调用本方法。设置了这个监听后，回车键就不能在EditText中插入新行了（ALT+回车可以插入新行）。
		editText.setOnEditorActionListener(new OnEditorActionListener() {
			@Override
			public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
				if (actionId == EditorInfo.IME_ACTION_DONE) {
					Log.w("Lesson", "actionId is EditorInfo.IME_ACTION_DONE:"+actionId);
				} else if (actionId == EditorInfo.IME_ACTION_GO) {
					Log.w("Lesson", "actionId is EditorInfo.IME_ACTION_GO:"+actionId);
				} else if (actionId == EditorInfo.IME_ACTION_NEXT) {
					Log.w("Lesson", "actionId is EditorInfo.IME_ACTION_NEXT:"+actionId);
				} else if (actionId == EditorInfo.IME_ACTION_NONE) {
					Log.w("Lesson", "actionId is EditorInfo.IME_ACTION_NONE:"+actionId);
				} else if (actionId == EditorInfo.IME_ACTION_SEARCH) {
					Log.w("Lesson", "actionId is EditorInfo.IME_ACTION_SEARCH:"+actionId);
				} else if (actionId == EditorInfo.IME_ACTION_SEND) {
					Log.w("Lesson", "actionId is EditorInfo.IME_ACTION_SEND:"+actionId);
				} else if (actionId == EditorInfo.IME_ACTION_UNSPECIFIED) {
					Log.w("Lesson", "actionId is EditorInfo.IME_ACTION_UNSPECIFIED:"+actionId);
				} else {
					Log.w("Lesson", "actionId is unknown:"+actionId);
				}
				return false;
			}
		});
		
	}
	
	
	/**
	 * AutoCompleteTextView
	 * 是一个可编辑的文本视图，当用户键入文本时，显示自动完成建议。建议列表显示在一个下拉菜单中，用户可以从中选择一项，以完成输入。
	 * 
	 * AutoCompleteTextView在布局XML文件中的属性
	 * android:completionHint - 显示在下拉列表中的提示信息
	 * android:completionThreshold - 设置用户必须输入多少个字符，再显示提示信息
	 * 
	 * 
	 */
	public void AboutAutoCompleteTextView() {
		AutoCompleteTextView autoCompleteTextView = new AutoCompleteTextView(this);
		
//		生成AutoCompleteTextView
//		1.建立数据源Datasouce，例如：从资源文件中取得String数组。
		String[] datasouce = getResources().getStringArray(android.R.array.emailAddressTypes);
//		2.建立Adapter，并连接Datasouce。
//		第2个参数，传入的是1个包含了TextView的布局XML文件的id。
		ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datasouce);
//		若布局XML文件中包含了多个View组件，则需要指定TextView的id。
		arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_2, android.R.id.text1, datasouce);
//		系统会使用Datasouce中，每个对象的toString()方法得到字符串，然后生成TextView。
		
//		3.连接AutoCompleteTextView和Adapter。系统会将生成的TextView和AutoCompleteTextView关联。
		autoCompleteTextView.setAdapter(arrayAdapter);
		
	}
	
	
	
	
	/**
	 * ListView
	 * ListView是一个ViewGroup，其中包含一个可滚动的元素列表。列表元素是由ListAdapter自动加进去的。
	 * 通过竖滚动条查看的列表视图。
	 * 
	 * ListView在布局XML文件中的属性
	 * android:choiceMode - 规定此ListView所使用的选择模式。缺省状态下，ListView没有选择模式。
	 * android:entries - 引用一个将使用在此ListView里的数组。若数组是固定的，使用此属性将比在程序中写入更为简单。
	 * android:divider - 规定List项目之间用某个图形或颜色来分隔。可以用"@[+][package:]type:name"或者"?[package:][type:]name"（主题属性）的形式来指向某个已有资源；也可以用"#rgb"，"#argb"，"#rrggbb"或者"#aarrggbb"的格式来表示某个颜色。
	 * android:footerDividersEnabled - 设成flase时，此ListView将不会在页脚视图前画分隔符。此属性缺省值为true。
	 * android:headerDividersEnabled - 设成flase时，此ListView将不会在页眉视图后画分隔符。此属性缺省值为true。
	 * android:cacheColorHint - 自定义图片背景的话，这个属性要设置为透明。
	 * 
	 * 
	 */
	public void AboutListView() {
		ListView listView = new ListView(this);
		
//		生成ListView，方法一（传统方法）：
		
//		1.建立数据源Datasouce，例如：从资源文件中取得String数组。
		String[] datasouce1 = getResources().getStringArray(android.R.array.emailAddressTypes);
		
//		2.建立Adapter，并连接Datasouce。
//		第2个参数，传入的是1个包含了TextView的布局XML文件的id。ListView的每个元素都会使用这个TextView来显示。
		ArrayAdapter<String> arrayAdapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datasouce1);
//		若布局XML文件中包含了多个View组件，则需要指定TextView的id。
		arrayAdapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_2, android.R.id.text1, datasouce1);
//		系统会使用Datasouce中，每个对象的toString()方法得到字符串，然后生成TextView。
		
//		3.连接ListView和Adapter。
		listView.setAdapter(arrayAdapter1);
		
//		4.若Datasouce发生改变，调用ArrayAdapter.notifyDataSetChanged()方法，通知所有和ArrayAdapter绑定的View组件。
		arrayAdapter1.notifyDataSetChanged();
		
		
//		生成ListView，方法二（适合1个Activity页面就1个ListView）：
		
//		1.生成的Activity要继承于android.app.ListActivity。
//		ListActivity是一个特殊的Activity。在ListActivity中，绑定一个数据源，即可显示一个元素列表，还可以监听用户点击元素的事件。
//		ListActivity内含一个ListView对象，可以绑定不同的数据源，例如数据、含有查询结果的游标。
		
//		2.建立数据源Datasouce，例如：从资源文件中取得String数组。
		String[] datasouce2 = getResources().getStringArray(android.R.array.emailAddressTypes);
		
//		3.建立Adapter，并连接Datasouce。
//		第2个参数，传入的是1个包含了TextView的布局XML文件的id。ListView的每个元素都会使用这个TextView来显示。
		ArrayAdapter<String> arrayAdapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datasouce2);
//		若布局XML文件中包含了多个View组件，则需要指定TextView的id。
		arrayAdapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_2, android.R.id.text1, datasouce2);
//		系统会使用Datasouce中，每个对象的toString()方法得到字符串，然后生成TextView。
		
//		4.在ListActivity中绑定Adapter。
		listView.setAdapter(arrayAdapter2); //ListActivity.setListAdapter(arrayAdapter);
		
//		5.若Datasouce发生改变，调用ArrayAdapter.notifyDataSetChanged()方法，通知所有和ArrayAdapter绑定的View组件。
		arrayAdapter2.notifyDataSetChanged();
		
		
		
//		生成ListView，方法三（在方法二的基础上改进，可以让ListActivity包含多个View）：
//		1.生成的Activity要继承于android.app.ListActivity。
		
//		2.生成ListActivity使用的布局XML文件，文件中必须包含1个id为“@android:id/list”的ListView组件。
		
//		3.在ListActivity的onCreate()方法中，绑定布局XML文件。
		
//		4.建立数据源Datasouce，例如：从资源文件中取得String数组。
		String[] datasouce3 = getResources().getStringArray(android.R.array.emailAddressTypes);
		
//		5.建立Adapter，并连接Datasouce。
//		第2个参数，传入的是1个包含了TextView的布局XML文件的id。ListView的每个元素都会使用这个TextView来显示。
		ArrayAdapter<String> arrayAdapter3 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, datasouce3);
//		若布局XML文件中包含了多个View组件，则需要指定TextView的id。
		arrayAdapter3 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_2, android.R.id.text1, datasouce3);
//		系统会使用Datasouce中，每个对象的toString()方法得到字符串，然后生成TextView。
		
//		6.在ListActivity中绑定Adapter。
		listView.setAdapter(arrayAdapter3); //ListActivity.setListAdapter(arrayAdapter3);
		
//		7.若Datasouce发生改变，调用ArrayAdapter.notifyDataSetChanged()方法，通知所有和ArrayAdapter绑定的View组件。
		arrayAdapter3.notifyDataSetChanged();
		
		
		
//		点击事件
		listView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				
			}
		});
		
//		长按事件
		listView.setOnItemLongClickListener(new OnItemLongClickListener() {
			@Override
			public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
				return false;
			}
		});
		
//		
		listView.setOnItemSelectedListener(new OnItemSelectedListener() {
//			当ListView中有元素被选中时，调用本方法。
//			parent - ListView对象，view - 被选中元素，position - 被选中元素在ListView中的位置，id - 被选中元素的行ID。
			@Override
			public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
				
			}
//			当ListView中被选中的元素被取消选择时，调用本方法。
//			parent - ListView对象
			@Override
			public void onNothingSelected(AdapterView<?> parent) {
				
			}
		});
		
	}
	
	/**
	 * ExpandableListView
	 * 是一个高级的ListView，每个ListView的元素本身可以展开，其中包含一个子ListView。ExpandableListView看起来就像一个2级的树形菜单。
	 * 
	 * ExpandableListView在布局XML文件中的属性
	 * 
	 */
	public void AboutExpandableListView() {
		ExpandableListView expandableListView = new ExpandableListView(this);
		
//		生成ExpandableListView，方法一（传统方法）：
//		1.建立groupData数据源。groupData要求是一个List<? extends Map<String, ?>>
//		下面1个Map对象表示一条记录，在ExpandableListView的1级List中占一行。
		Map<String, String> groupMap1 = new HashMap<String, String>();
		groupMap1.put("name", "张三");
		groupMap1.put("gender", "男");
		
		Map<String, String> groupMap2 = new HashMap<String, String>();
		groupMap2.put("name", "李四");
		groupMap2.put("gender", "男");
		
		List<Map<String, String>> groupData = new ArrayList<Map<String,String>>();
		groupData.add(groupMap1);
		groupData.add(groupMap2);
		
//		2.建立childData数据源。childData要求是一个List<? extends List<? extends Map<String, ?>>>
//		下面1个Map对象表示一条记录，在ExpandableListView的2级List中占一行。
		Map<String, String> childMap11 = new HashMap<String, String>();
		childMap11.put("year", "2011");
		childMap11.put("math", "及格");
		childMap11.put("english", "良好");
		
		Map<String, String> childMap12 = new HashMap<String, String>();
		childMap12.put("year", "2012");
		childMap12.put("math", "良好");
		childMap12.put("english", "良好");
		
//		下面1个List对象表示1个2级List。
		List<Map<String, String>> childList1 = new ArrayList<Map<String,String>>();
		childList1.add(childMap11);
		childList1.add(childMap12);
		
		
//		下面1个Map对象表示一条记录，在ExpandableListView的2级List中占一行。
		Map<String, String> childMap21 = new HashMap<String, String>();
		childMap21.put("year", "2011");
		childMap21.put("math", "优秀");
		childMap21.put("english", "不及格");
		
		Map<String, String> childMap22 = new HashMap<String, String>();
		childMap22.put("year", "2012");
		childMap22.put("math", "优秀");
		childMap22.put("english", "及格");
		
//		下面1个List对象表示1个2级List。
		List<Map<String, String>> childList2 = new ArrayList<Map<String,String>>();
		childList2.add(childMap21);
		childList2.add(childMap22);
		
		
		List<List<Map<String, String>>> childData = new ArrayList<List<Map<String,String>>>();
		childData.add(childList1);
		childData.add(childList2);
		
		
//		3.建立Adapter，并连接Datasouce。
//		第三个参数传入的是1个包含了TextView的布局XML文件的id。
//		第四个参数传入一个String数组，系统使用数组中的对象，和Map中的Key相匹配。
//		第五个参数传入一个int数组，系统
		ExpandableListAdapter expandableListAdapter = new SimpleExpandableListAdapter(this, groupData,
				android.R.layout.simple_expandable_list_item_2, new String[]{"name","gender"}, new int[]{android.R.id.text1,android.R.id.text2},
				childData,
				android.R.layout.simple_list_item_2, new String[]{"year","math"}, new int[]{android.R.id.text1,android.R.id.text2});
		
//		4.连接ExpandableListView和Adapter。
		expandableListView.setAdapter(expandableListAdapter);
		
		
		
		
//		生成ExpandableListView，方法二（适合1个Activity页面就1个ExpandableListView）：
//		1.生成的Activity要继承于android.app.ExpandableListActivity。
//		ExpandableListActivity是一个特殊的Activity，内含一个ExpandableListView对象，可以绑定不同的数据源，例如数据、含有查询结果的游标。
		
//		2.建立数据源Datasouce。（和方法一相同）
		
//		3.建立Adapter，并连接Datasouce。（和方法一相同）
		
//		4.在ExpandableListActivity中绑定Adapter。
		expandableListView.setAdapter(expandableListAdapter); //ExpandableListActivity.setListAdapter(expandableListAdapter);
		
		
		
		
//		生成ExpandableListView，方法三（在方法二的基础上改进，可以让ExpandableListActivity包含多个View）：
//		1.生成的Activity要继承于android.app.ExpandableListActivity。
		
//		2.生成ExpandableListActivity使用的布局XML文件，文件中必须包含1个id为“@android:id/list”的ExpandableListView组件。
		
//		3.在ListActivity的onCreate()方法中，绑定布局XML文件。
		
//		4.建立数据源Datasouce。（和方法一相同）
		
//		5.建立Adapter，并连接Datasouce。（和方法一相同）
		
//		6.在ExpandableListActivity中绑定Adapter。
		expandableListView.setAdapter(expandableListAdapter); //ExpandableListActivity.setListAdapter(expandableListAdapter);
		
		
//		Child点击事件
		expandableListView.setOnChildClickListener(new OnChildClickListener() {
			@Override
			public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
				return false;
			}
		});
		
//		Group点击事件
		expandableListView.setOnGroupClickListener(new OnGroupClickListener() {
			@Override
			public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
				return false;
			}
		});
		
//		Group收起事件
		expandableListView.setOnGroupCollapseListener(new OnGroupCollapseListener() {
			@Override
			public void onGroupCollapse(int groupPosition) {
				
			}
		});
		
//		Group收起事件
		expandableListView.setOnGroupExpandListener(new OnGroupExpandListener() {
			@Override
			public void onGroupExpand(int groupPosition) {
				
			}
		});
		
	}
	
	
	
	/**
	 * GridView
	 * 一个在平面上可显示多个条目的可滚动的视图组件，该组件中的条目通过一个ListAdapter和该组件进行关联。
	 * 比如实现九宫格图，用GridView是首选，也是最简单的。
	 * 
	 * GridView在布局XML文件中的属性
	 * android:columnWidth - 设置列的宽度。关联的方法为：setColumnWidth(int)
	 * android:numColumns - 列数。关联方法：setNumColumns(int)
	 * android:gravity - 设置此组件中的内容在组件中的位置。可选的值有：top、bottom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical 可以多选，用“|”分开。关联方法：setGravity (int gravity)
	 * android:horizontalSpacing - 两列之间的间距。关联方法：setHorizontalSpacing(int)
	 * android:verticalSpacing - 两行之间的间距。关联方法：setVerticalSpacing(int)
	 * android:stretchMode - 缩放模式。关联方法：setStretchMode(int)
	 * 
	 * 
	 */
	public void AboutGridView() {
		GridView gView = new GridView(this);
		
//		生成GridView
		
		
	}
	
	/**
	 * ScrollView
	 * 一种可供用户滚动的层次结构布局容器，允许显示比实际多的内容。
	 * ScrollView是一种FrameLayout，意味需要在其上放置1个（只能1个）有自己滚动内容的子元素。
	 * 子元素可以是一个复杂的对象的布局管理器。通常用的子元素是垂直方向的LinearLayout。
	 * ScrollView只支持垂直方向的滚动，一般作为根元素使用。
	 * 
	 * 
	 * ScrollView在布局XML文件中的属性
	 * 
	 * 
	 */
	public void AboutScrollView() {
		ScrollView scrollView = new ScrollView(this);
		
		
		
		
	}
	
	/**
	 * SlidingDrawer
	 * 滑动式抽屉中包含一些隐藏的内容，并允许用户拖拽一个handle以显示隐藏的内容。
	 * SlidingDrawer可以在垂直或者水平使用。它由两个子视图组成：一个是用户拖拽的handle（柄），另一个是随着拖动变化的content（内容）。
	 * SlidingDrawer应当作为内部布局的覆盖来使用，也就是说SlidingDrawer内部应该使用FrameLayout或RelativeLayout布局。
	 * SlidingDrawer的大小决定了其内容显示时所占空间的大小，所以它的尺寸一般定义为match_parent。在XML布局中SlidingDrawer必须指定handle和content的id
	 * 
	 * SlidingDrawer在布局XML文件中的属性
	 * android:handle - 定义handle（柄）的ID。SlidingDrawer中的View引用这个ID后，就会被当做handle（柄）。
	 * android:content - 定义content（内容）的ID。SlidingDrawer中的View引用这个ID后，就会被当做content（内容）。
	 * android:allowSingleTap - 是否可通过单击handle打开/关闭SlidingDrawer。如果是false，用户必须通过拖动，滑动或者使用轨迹球，来打开/关闭SlidingDrawer。默认是true。
	 * android:animateOnClick - 指示当用户点击handle的时候，抽屉是否以动画的形式打开或关闭。默认的是true。
	 * android:orientation - SlidingDrawer的方向。可选值有horizontal（水平）、vertical（垂直）。
	 * 
	 * 
	 */
	public void AboutSlidingDrawer() {
		SlidingDrawer slidingDrawer = new SlidingDrawer(this, null);
		
//		SlidingDrawer打开事件
		slidingDrawer.setOnDrawerOpenListener(new OnDrawerOpenListener() {
			@Override
			public void onDrawerOpened() {
				
			}
		});
		
//		SlidingDrawer关闭事件
		slidingDrawer.setOnDrawerCloseListener(new OnDrawerCloseListener() {
			@Override
			public void onDrawerClosed() {
				
			}
		});
		
	}
	
	/**
	 * TabLayout
	 * Android中的TAB页，由TabHost、TabWidget和FrameLayout构成。
	 * TabHost必须是根元素，其中包含TabWidget（显示所有的TAB标签）和FrameLayout（显示TAB内容）。
	 * 有两种方式实现TAB页面：在同一个Activity中切换View，或者使用不同的Activity切换TAB。
	 * 
	 */
	public void AboutTabLayout() {
		
//		生成TabLayout（使用不同的Activity切换TAB）
//		1.生成两个FrameLayoutActivity。（用于Tab页面）
		class FrameLayout1 extends Activity {
			@Override
			protected void onCreate(Bundle savedInstanceState) {
				super.onCreate(savedInstanceState);
				
				TextView textview = new TextView(this);
				textview.setText("This is the FrameLayout1");
				setContentView(textview);
			}
		}
		
		class FrameLayout2 extends Activity {
			@Override
			protected void onCreate(Bundle savedInstanceState) {
				super.onCreate(savedInstanceState);
				
				TextView textview = new TextView(this);
				textview.setText("This is the FrameLayout2");
				setContentView(textview);
			}
		}
		
		
//		2.准备两个图标。（分别表示TAB标签是否选中）
		
//		3.在res/drawable/建立一个XML文件，使用selector切换TAB标签的图标。
/*		<?xml version="1.0" encoding="utf-8"?>
		<selector xmlns:android="http://schemas.android.com/apk/res/android">
		    <!-- When selected, use grey -->
		    <item android:drawable="@drawable/ic_tab_artists_grey"
		          android:state_selected="true" />
		    <!-- When not selected, use white-->
		    <item android:drawable="@drawable/ic_tab_artists_white" />
		</selector>*/
		
//		4.建立TabHostActivity使用的布局文件。TabWidget的ID必须为tabs，FrameLayout的ID必须为tabcontent。
/*		<?xml version="1.0" encoding="utf-8"?>
		<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
		    android:id="@android:id/tabhost"
		    android:layout_width="fill_parent"
		    android:layout_height="fill_parent">
		    <LinearLayout
		        android:orientation="vertical"
		        android:layout_width="fill_parent"
		        android:layout_height="fill_parent"
		        android:padding="5dp">
		        <TabWidget
		            android:id="@android:id/tabs"
		            android:layout_width="fill_parent"
		            android:layout_height="wrap_content" />
		        <FrameLayout
		            android:id="@android:id/tabcontent"
		            android:layout_width="fill_parent"
		            android:layout_height="fill_parent"
		            android:padding="5dp" />
		    </LinearLayout>
		</TabHost>*/
		
//		5.建立TabHostActivity。
		class TabHostActivity extends TabActivity {
			public void onCreate(Bundle savedInstanceState) {
				super.onCreate(savedInstanceState);
//				绑定TabHostActivity使用的布局文件
			    setContentView(android.R.layout.preference_category);
				
//				得到TabHost对象
				TabHost tabHost = getTabHost();
				
//				使用TabHost对象生成TabSpec对象，参数传入的是TabSpec的ID。（每个TabSpec对象表示一个Tab页，包含标签和内容。）
				TabSpec tabSpec1 = tabHost.newTabSpec("FrameLayout1");
				TabSpec tabSpec2 = tabHost.newTabSpec("FrameLayout2");
				
//				通过TabSpec对象设置，标签上显示的文字和图标（第二个参数传入selectorXML文件，即可实现图标切换效果）
				tabSpec1.setIndicator("Tab1",this.getResources().getDrawable(android.R.drawable.ic_btn_speak_now));
				tabSpec2.setIndicator("Tab2",this.getResources().getDrawable(android.R.drawable.ic_btn_speak_now));
				
//				通过TabSpec对象设置FrameLayout。此处可以传入Intent显示Activity，或传入View显示界面。
				tabSpec1.setContent(new Intent(this,FrameLayout1.class));
				tabSpec2.setContent(new Intent(this,FrameLayout2.class));
				
//				将TabSpec对象加进TabHost对象。
				tabHost.addTab(tabSpec1);
				tabHost.addTab(tabSpec2);
				
//				通过TabHost对象设置当前选中的TabSpec。
			    tabHost.setCurrentTab(2);
				
//				TAB页切换事件
			    tabHost.setOnTabChangedListener(new OnTabChangeListener() {
//			    	切换TAB页时调用本方法，tabId就是newTabSpec时传入的字符串。
					@Override
					public void onTabChanged(String tabId) {
						
					}
				});
				
			}
			
		}
		
		
		
		
		
	}

	/**
	 * WebView
	 * 用来在Activity中，显示网页。
	 * 使用这个组件，需要在AndroidManifest.xml中加入互联网访问权限。<uses-permission android:name="android.permission.INTERNET" />
	 * 
	 * 
	 */
	public void AboutWebView() {
		WebView webView = new WebView(this);
		
//		使WebView组件支持JS脚本
		webView.getSettings().setJavaScriptEnabled(true);
		
//		装载指定的网页。
		webView.loadUrl("www.google.com");
		
	}
	
	/**
	 * ImageView
	 * 显示任意图像，例如图标。
	 * ImageView类可以加载各种来源的图片（如资源或图片库），需要计算图像的尺寸，比便它可以在其他布局中使用，并提供例如缩放和着色（渲染）各种显示选项。
	 * 
	 * ImageView在布局XML文件中的属性
	 * android:adjustViewBounds - 设置该属性为true，可以在 ImageView调整边界时保持图片的纵横比例。需要与maxWidth、MaxHeight一起使用，单独使用没有效果。
	 * 
	 * 
	 * 
	 * 
	 */
	public void AboutImageView() {
		
	}
	
	/**
	 * ImageButton
	 * 显示一个可以被用户点击的图片按钮。默认情况下，ImageButton看起来像一个普通的按钮，在不同状态（如按下）下改变背景颜色。
	 * 按钮的图片可用通过<ImageButton> XML元素的android:src属性或setImageResource(int)方法指定。
	 * 
	 * 
	 * ImageButton在布局XML文件中的属性
	 * android:backgroud - 可以使用设置背景色的方法，来替代ImageButton默认的背景。
	 * android:src - 设置ImageButton使用的图标，可以设置为selector实现选中效果。
	 * 
	 */
	public void AboutImageButton() {
		
	}
	
	
	/**
	 * Gallery
	 * 一个锁定中心条目并且拥有水平滚动列表的视图。例如图库程序中，图片列表使用GridView显示缩略图，使用Gallery浏览图片。
	 * 
	 * Gallery在布局XML文件中的属性
	 * 
	 * 
	 */
	public void AboutGallery() {
		
		
	}
	
	/**
	 * ViewSwitcher
	 * 在两个视图间转换时显示动画，有一个可以创建这些视图的工厂类。你可以用工厂来创建这些视图，也可以自己创建。
	 * 1个ViewSwitcher只允许包含两个子视图，且一次仅能显示1个。
	 * 常用的是ViewSwitcher的两个子类--ImageSwitcher和TextSwitcher。
	 * 
	 * ImageSwitcher
	 * ImageSwitcher是Android中控制图片展示效果的一个组件。通常配合Gallery做相册使用。
	 * 
	 * TextSwitcher
	 * TextSwitcher仅仅包含子类型TextView。TextSwitcher被用来使屏幕上的label产生动画效果。每当setText(CharSequence)被调用时，TextSwitcher使用动画方式将当前的文字内容消失并显示新的文字内容。
	 * 
	 * 
	 */
	public void AboutViewSwitcher() {
		ImageSwitcher imageSwitcher = new ImageSwitcher(this);
		
//		用ImageSwitcher之前，要先对其setFactory。
		imageSwitcher.setFactory(new ViewFactory() {
//			这里要返回的组件，就是用来显示在ImageSwitcher中的。
			@Override
			public View makeView() {
				return new ImageView(UserInterface.this);
			}
		});
		
//		设置图片到Factory返回的View组件上
		imageSwitcher.setImageResource(android.R.drawable.ic_btn_speak_now);
		imageSwitcher.setImageDrawable(getWallpaper());
		
		
	}
	
	/**
	 * DatePicker
	 * 一个选择年月日的日历布局视图。
	 * 
	 * DatePicker在布局XML文件中的属性
	 * android:startYear - 设置开始的年份
	 * android:endYear - 设置结束的年份
	 * 
	 * 
	 * 
	 */
	public void AboutDatePicker() {
		DatePicker datePicker = new DatePicker(this);
		Calendar calendar = Calendar.getInstance();
		
//		使用当前日期初始化DatePicker
		datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), new OnDateChangedListener() {
//			日期发生改变时，调用本方法。
			@Override
			public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
				
			}
		});
		
	}
	
}
